Improve thread safety of Signal internal.
#453
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Basically the
updateLockis removed, andstateis wrapped withAtomic.But why replacing the existing RCU scheme?
Let's look at how the compiled assembly does the work:
It seems safe, especially since writes are serialised.
But what if we shift the timeline of thread B a little bit further?
Data races now exist due to ARC not being part of the atomic read/write. Our RCU model considers only the atomicity of
self.statealone without the hidden side effect of ARC.While the contention window is extremely small (a few instruction cycles), it is possible on paper that the
AliveStateis released before a concurrent relaxed reader retains it.So until we manage to find a way to use atomic with ARC, or having Swift natively provide an ARC aware
AtomicPointerprimitive, we should fallback toAtomic.Checklist
Updated CHANGELOG.md.